<?php
/**
 * 数据库访问接口适配器接口
 * @author Leo 2010-09-06
 */
abstract class DataSource {
	protected $options = array ();
	protected $encoding = 'UTF8';
	protected $connection = NULL;
	protected $error_msg = '';
	/**
	 * 构造函数,只负责为子类接收参数
	 * @param array $options 数据源参数(选项)
	 */
	public function __construct($options = array()) {
		$this->options = $options;
	}
	/**
	 * 连接数据库
	 * @return boolean 成功返回true,失败返回false
	 */
	public abstract function connect();
	
	/**
	 * 表全名,即添加前缀的后的名称
	 * @param string $tablename 表名称
	 */
	public abstract function fullname($table);
	/**
	 * 选择数据库
	 * @param string $db 要选择的数据库
	 * @return boolean 成功true,失败false
	 */
	public abstract function uses($db);
	/**
	 * 查询操作
	 * @param string $sql 要查询的语句
	 * @return ResultSet 查询结果集,失败返回false
	 */
	public abstract function query($sql);
	/**
	 * 分页查询
	 * @param string $sql 语句
	 * @param int $start 分页
	 * @param int $limit 分页大小
	 * @return ResultSet 查询结果集
	 */
	public abstract function queryLimit($sql, $start, $limit);
	/**
	 * 执行非查询SQL语句
	 * @param string $sql 要执行的SQL语句
	 * @return int 操作影响的行数
	 */
	public abstract function execute($sql);
	/**
	 * 最后一次生成的主键值
	 * @return int 
	 */
	public abstract function last_insert_id($name = '');
	/**
	 * 开始事务
	 * @return boolean 事务是否开始成功
	 */
	public abstract function begin();
	/**
	 * 提交事务
	 * @return boolean 提交是否成功
	 */
	public abstract function commit();
	/**
	 * 回滚事务
	 * @return boolean 回滚是否成功
	 */
	public abstract function rollback();
	/**
	 * 转义字字符
	 * @param string $str 要转义的字符
	 * @return	string 已经转义的字符
	 */
	public abstract function escape($str);
	/**
	 * 是否支持prepare SQL
	 * @return boolean 支持返回true
	 */
	public function prepareSqlSupport() {
		return false;
	}
	/**
	 * 设置连接字符编码
	 * @param string $encoding 编码
	 */
	public function encoding($encoding) {
		$this->encoding = $encoding;
	}
	/**
	 * 返回最近一次错误信息
	 * @return string 错误信息
	 */
	public function last_error_msg($msg = '') {
		if (! empty ( $msg )) {
			$this->error_msg = $msg;
		} else {
			return $this->error_msg;
		}
	}
	
	/**
	 * 断开与数据库的连接
	 */
	public function discounect() {
		return true;
	}
}